iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0

運用 SQL 敘述(Statement) 可以從資料庫中撈取使用者資料。不免俗的,出現動起歪腦筋的有心人士便會隨之而來。無論你是使用 Node.js, php...來當作後端語言,當你寫下 SQL 敘述句的那一刻起,就要心想會有一些惡意的語句伴隨在使用者的所給予的輸入資料中。

SQL Injection (SQL 隱碼) 攻擊

在正常的查詢命令中,利用前後端都疏於對使用者的輸入字串進行過濾,在裡頭夾雜 SQL 指令。當資料庫伺服器接收到後,就直接執行。如此一來,有心人士便可任意的更動、增刪或竊取資訊。

惡意指令的作用原理

這跟 SQL 敘述的語法結構有關。

  • 對於傳入的字串參數是用 '' 單引號包住
  • 可以在語法中夾帶註解 (/**/ 或是 -- )都可以

所以任意的相信使用者所輸入傳來的值,就會變成一件有風險的事。
如果有一個網站,關於帳號密碼驗證的 SQL 敘述句如下:

SELECT * FROM Users WHERE email='$email' AND password='$password';

有心人士提供的 email 參數為:

email = "'or 1=1 /*";
password = "abcde";

如果直接將上述那串參數直接套用,就會變成:

SELECT * FROM Users WHERE email=''or 1=1 /*'' password='abcde';

這樣一來,SQL 敘述句意思就變成 Users 表單中有填 Email 的就回傳,也不需要驗證密碼了。換言之,SQL Injection 的攻擊手法滿像拼字遊戲的,但一旦成功造成的資訊外洩問題也很令人頭疼。

下一篇會提及 Object Relational Mapping (ORM),提供開發者一個簡便、安全的方式去操作資料庫,同時會提及它的限制。


上一篇
Day7 - 今晚,你想來點 關聯 / 非關聯?
下一篇
Day 9 ORM 物件關係對映
系列文
SQL 30天手把手入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言